/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#include "播放条.h"

#include "A_引擎/文件工程/工程文件.h"


float32	S_时间轴帧绘制信息::g尺线绘制间隔 = 40.0f;
float32	S_时间轴帧绘制信息::g时间区间缩放 = 5.0f;

static bool		g时间更新绘制更新 = false;




void S_时间轴帧绘制信息::f_时间区间改变() {
	auto& time = f_prop_iVec2(f_NodeCtx_get帧().帧区间);
	int32 帧数量 = (time.y - time.x);

}




void f_时间轴_更新状态栏(bool p) {
	g时间更新绘制更新 = p;

	auto* f = f_projectFile_取当前工程文件();

	if (f_NodeCtx_get帧().当前帧.m_UI->m_Set) {
		for (auto& e : *f_NodeCtx_get帧().当前帧.m_UI->m_LinkWidget) {
			e->m_绘制属性更新 = true;
		}
		f_NodeCtx_get帧().当前帧.m_UI->m_Set(f_NodeCtx_get帧().当前帧);
	}
	
	f_ob_set步进时间帧(f_prop_I32(f_NodeCtx_get帧().当前帧));

}


void f_时间工作区_刷新时间线绘制(C_Widget* self, ui_绘制模板_画预设图形& 时间线绘制模板, int32 步进, float32 height) {
	
	auto& time = f_prop_iVec2(f_NodeCtx_get帧().帧区间);

	mat3X2 mat;
	auto* f = f_projectFile_取当前工程文件();
	
	self->m_绘制属性更新 = true;

	f_global_变换手柄到物体中心();

	f_时间轴_更新状态栏(true);
}

void f_时间工作区_时间线绘制(C_Widget* self, ui_绘制模板_画预设图形& 绘制模板) {
	int32 当前帧 = f_prop_I32(f_NodeCtx_get帧().当前帧);

	绘制模板.f_alloc(1);

	float32 时间帧位置 = 当前帧 * S_时间轴帧绘制信息::g时间区间缩放 * self->m_扩展视口属性->m_比例.x;
	时间帧位置 += self->m_扩展视口属性->m_中心.x;

	mat3X2 mat;
	mat.row0.x = 时间帧位置;
	mat.row0.y = 0;
	mat.row1.x = 1;
	mat.row1.y = self->m_Size.y;
	mat.row2 = { 1, 0 };
	auto C = f_PackData4X8(S_主题颜色::uic_当前时间线);

	绘制模板.f_set单色线(0, mat, { 1.0, C, C }, S_Widget预设图元::m_竖线, 3.0);
}

mat3X2 f_时间工作区_时间区间绘制矩阵(C_Widget* self) {
	auto& time = f_prop_iVec2(f_NodeCtx_get帧().帧区间);
	float32 帧数量 = float32(time.y - time.x);

	mat3X2 r{};
	r.row0.x = time.x * S_时间轴帧绘制信息::g时间区间缩放;
	r.row0.y = 0;
	r.row1.x = 帧数量 * S_时间轴帧绘制信息::g时间区间缩放 * self->m_扩展视口属性->m_比例.x;
	r.row1.y = 帧数量 * S_时间轴帧绘制信息::g时间区间缩放 * self->m_扩展视口属性->m_比例.y;

	r.row0.x += self->m_扩展视口属性->m_中心.x;

	return r;
}

float32 f_时间工作区_从鼠标位置计算时间帧(C_Widget* self) {
	auto c = f_widget_get鼠标局部位置(self->g_鼠标.gPos, self);
	int64 当前帧 = ((c.x - self->m_扩展视口属性->m_中心.x)) / self->m_扩展视口属性->m_比例.x / S_时间轴帧绘制信息::g时间区间缩放;
	f_NodeCtx_set场景当前时间(当前帧);
	return 当前帧;
}

float32 f_时间工作区_计算尺线绘制间隔(float32 区间变换后宽度) {
	int32 线数量 = int32((区间变换后宽度 + S_时间轴帧绘制信息::g尺线绘制间隔) / (S_时间轴帧绘制信息::g尺线绘制间隔 * 2));
	线数量 = 线数量 >> 1 << 1;
	return 区间变换后宽度 * 0.5 / 线数量;
}

vec2 f_时间工作区_计算尺线绘制间隔(vec2 区间变换后宽度) {
	int32 线数量X = int32((区间变换后宽度.x + S_时间轴帧绘制信息::g尺线绘制间隔) / (S_时间轴帧绘制信息::g尺线绘制间隔 * 2));
	int32 线数量Y = int32((区间变换后宽度.y + S_时间轴帧绘制信息::g尺线绘制间隔) / (S_时间轴帧绘制信息::g尺线绘制间隔 * 2));
	线数量X = 线数量X >> 1 << 1;
	线数量Y = 线数量Y >> 1 << 1;
	return { 区间变换后宽度.x * 0.5f / 线数量X, 区间变换后宽度.y * 0.5f / 线数量Y };
}

vec2 f_时间工作区_计算刻度文本_数量步进(float32 帧绘制间隔宽度, float32 刻度线步进宽度) {
	auto& time = f_prop_iVec2(f_NodeCtx_get帧().帧区间);
	int32 帧数量 = (time.y - time.x);

	float32 线数量 = 帧绘制间隔宽度 / (刻度线步进宽度 * 2);

	vec2 数量步进和间隔;
	数量步进和间隔.y = float32(帧数量) / 线数量;
	数量步进和间隔.x = 线数量 + 1;

	return 数量步进和间隔;
}



E_事件是否传递 f_工作区_横向缩放页面视口(C_Widget* self, uint8 状态) {
	float32 z = C_Widget::g_鼠标.lZ;
	vec2 s = { 1,1 };
	if (z > 0) {
		s.x = 1.15;
	}
	else if (z < 0) {
		s.x = 0.9;
	}

	f_C_Widget_鼠标位置视口缩放(self, s);
	return E_事件是否传递::e_事件传递_终止;
}



E_事件是否传递 f_工作区_纵向缩放页面视口(C_Widget* self, uint8 状态) {
	float32 z = C_Widget::g_鼠标.lZ;
	vec2 s = { 1,1 };
	if (z > 0) {
		s.y = 1.15;
	}
	else if (z < 0) {
		s.y = 0.9;
	}

	f_C_Widget_鼠标位置视口缩放(self, s);
	return E_事件是否传递::e_事件传递_终止;
}

E_事件是否传递 f_工作区_缩放页面视口(C_Widget* self, uint8 状态) {
	float32 z = C_Widget::g_鼠标.lZ;

	//C_曲线编辑视口* box = (C_曲线编辑视口*)self;

	vec2 s = { 1,1 };
	if (z > 0) {
		s.x = 1.15;
		s.y = 1.15;
	}
	else if (z < 0) {
		s.x = 0.9;
		s.y = 0.9;
	}


	f_C_Widget_鼠标位置视口缩放(self, s);

	//f_时间工作区_时间线绘制(box, box->m_时间线绘制, f_prop_I32(f_NodeCtx_get帧().当前帧), self->m_父部件->m_Size.y);
	//box->帧绘制信息.m_缩放循环步进 = 缩放后间隔;

	return E_事件是否传递::e_事件传递_终止;
}


